package com.kfm.base.map;

import java.util.*;

public class Exer {


    public static void exer01() {
        Map<String, String> map = new HashMap<>();
        // 将我国省份和其简称存到 Map 集合中
        map.put("香港特别行政区", "港");
        map.put("澳门特别行政区", "澳");
        map.put("北京市", "京");
        map.put("天津市", "津");
        map.put("上海市", "沪");
        map.put("重庆市", "渝");
        map.put("河北省", "冀");
        map.put("山西省", "晋");
        map.put("辽宁省", "辽");
        map.put("吉林省", "吉");
        map.put("黑龙江省", "黑");
        map.put("江苏省", "苏");
        map.put("浙江省", "浙");
        map.put("安徽省", "皖");
        map.put("福建省", "闽");
        map.put("江西省", "赣");
        map.put("山东省", "鲁");
        map.put("河南省", "豫");
        map.put("湖北省", "鄂");
        map.put("湖南省", "湘");
        map.put("广东省", "粤");
        map.put("海南省", "琼");
        map.put("四川省", "川");
        map.put("贵州省", "黔");
        map.put("云南省", "滇");
        map.put("陕西省", "陕");
        map.put("甘肃省", "甘");
        map.put("青海省", "青");
        map.put("台湾省", "台");
        map.put("内蒙古自治区", "蒙");
        map.put("广西壮族自治区", "桂");
        map.put("西藏自治区", "藏");
        map.put("宁夏回族自治区", "宁");
        map.put("新疆维吾尔自治区", "新");

        System.out.println(map.size());

        // 将省份名称中包含"江"的省份从集合中删除
        Set<Map.Entry<String, String>> entries = map.entrySet();

        Iterator<Map.Entry<String, String>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            String key = next.getKey();
            if (key.contains("江")) {
                iterator.remove();
            }
        }

        // 遍历
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry);
        }


    }

    /**
     * 输入一个字符串，统计字符串中每个字符出现的次数并输出
     *
     * @param str
     */
    public static void exer02(String str) {
        // 字符 -- 出现次数
        Map<Character, Integer> map = new HashMap<>();

        char[] charArray = str.toCharArray();

        for (char c : charArray) {
            if (map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }
        }

        Set<Map.Entry<Character, Integer>> entries = map.entrySet();

        Iterator<Map.Entry<Character, Integer>> iterator = entries.iterator();

        while (iterator.hasNext()) {
            Map.Entry<Character, Integer> entry = iterator.next();
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }

    }

    public static void exer021(String str) {
        // 字符 -- 出现次数
        /**
         * 这段代码是用来统计一个字符串中每个字符出现的次数，并将结果存储在一个Map<Character, Integer>类型的变量map中。
         *
         * 首先，创建一个空的HashMap,键为Character类型，值为Integer类型。
         * 然后，使用for-each循环遍历字符串str中的每个字符c。在循环内部，使用map.getOrDefault(c, 0)方法获取当前字符c在map中的值，
         * 如果c不存在，则返回默认值0。接着，将获取到的值加1,并将结果放回map中。
         * 这样，当循环结束时，map中存储的就是字符串str中每个字符出现的次数。
         */
        Map<Character, Integer> map = new HashMap<>();

        for (char c : str.toCharArray()){
            map.put(c, map.getOrDefault(c, 0) + 1);
        }


        // 遍历输出
//        map.forEach(new BiConsumer<Character, Integer>() {
//            @Override
//            public void accept(Character k, Integer v) {
//                System.out.println(k + " = " + v);
//            }
//        });
        map.forEach( (k, v) -> System.out.println(k + " = " + v));

    }

    public static void exer022(String str) {
        // 字符 -- 出现次数
        /**
         * 这段代码是用来统计一个字符串中每个字符出现的次数，并将结果存储在一个Map<Character, Integer>类型的变量map中。
         *
         * 首先，创建一个空的HashMap,键为Character类型，值为Integer类型。
         * 然后，使用for-each循环遍历字符串str中的每个字符c。在循环内部，使用map.getOrDefault(c, 0)方法获取当前字符c在map中的值，
         * 如果c不存在，则返回默认值0。接着，将获取到的值加1,并将结果放回map中。
         * 这样，当循环结束时，map中存储的就是字符串str中每个字符出现的次数。
         */
        Map<Character, Integer> map = new HashMap<>();

        for (char c : str.toCharArray()){
            map.compute(c, (k, v) -> v == null? 1 : v + 1);
        }


        // 遍历输出
//        map.forEach(new BiConsumer<Character, Integer>() {
//            @Override
//            public void accept(Character k, Integer v) {
//                System.out.println(k + " = " + v);
//            }
//        });
        map.forEach( (k, v) -> System.out.println(k + " = " + v));

    }

    public static void exer03(String[] words){
        // 定义一个 map 将 a~z 和 [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."] 对应
        String[] arr = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
        Map<Character, String> map = new HashMap<>();

        for (int i = 0; i < arr.length; i++) {
            String c = arr[i];
            map.put((char)('a' + i), c);
        }


        Set<String> set = new TreeSet<>();

        for (int i = 0; i < words.length; i++) {
            char[] charArray = words[i].toCharArray();
            String result = "";
            for (int j = 0; j < charArray.length; j++) {
                result += map.get(charArray[j]);
            }
            set.add(result);
        }

        System.out.println(set.size());

        for (String str : set){
            System.out.println(str);
        }

    }


    public static void exer04(String[] words){
        String[] arr = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

        Set<String> set = new TreeSet<>();

        for (int i = 0; i < words.length; i++) {
            char[] charArray = words[i].toCharArray();
            String result = "";
            for (int j = 0; j < charArray.length; j++) {
                result += arr[charArray[j] - 'a'];
            }
            set.add(result);
        }

        System.out.println(set.size());

        for (String str : set){
            System.out.println(str);
        }

    }
    public static void main(String[] args) {
        String str = "abc,d~abcdabca,!.";
        exer022(str);

//        String[] strs = {"gin", "zen", "gig", "msg"};
//        exer03(strs);
//        Map<String, Integer> map = new HashMap<>();
//        map.put("a", 6);
//
//        System.out.println(map.get("a"));
//        System.out.println(map.getOrDefault("a", 0));
//
//        map.put("a", 10);
//
//        System.out.println(map);

//        HashMap<Short, String> map = new HashMap<>();
//
//        for (short i = 0; i < 100; i ++){
//            // put Short String  short --> Short Short.valueOf --> new Short()
//            map.put(i, String.valueOf(i));
//            map.remove(i - 1); // Integer int--> Integer Integer.valueOf --> new Integer
//        }

//        for (double i = 0; i < 100; i ++){
//            // put Double String  double --> Double Double.valueOf --> new Double()
//            map.put(i, String.valueOf(i));
//            map.remove(i - 1); // double double--> Double Double.valueOf --> new Double
//        }

//        System.out.println(map.size());

    }
}
